void Polygon (TopOfCurve, CurveLen, MaxErr, NofSegs, Chain, Segs)
int    TopOfCurve, CurveLen, MaxErr, *NofSegs;
ChnTyp * Chain;
SegTyp * Segs;
{
   int    r0,c0,r1,c1, m,n, LineLen, Difference, MaxErrPos, MaxDiff;
   LinTyp * Line;

   r1 = Chain[TopOfCurve].r;
   c1 = Chain[TopOfCurve].c;
   r0 = Chain[TopOfCurve-CurveLen+1].r;
   c0 = Chain[TopOfCurve-CurveLen+1].c;

   LineLen = GenLine (r0,c0,r1,c1, Line);
   MaxErrPos = 0;
   MaxDiff   = 0;
   for (m=1, n=TopOfCurve-CurveLen+1;  m<=LineLen;  m++, n++) {
      Difference = abs (Line[m].c - Chain[n].c) +
                   abs (Line[m].r - Chain[n].r);
      if (Difference > MaxDiff) {
         MaxErrPos = m;
         MaxDiff   = Difference;
   }  }
   if (MaxDiff > MaxErr) {
      Polygon (TopOfCurve, CurveLen-MaxErrPos+1, MaxErr, NofSegs, Chain, Segs);
      Polygon (TopOfCurve-CurveLen+MaxErrPos, MaxErrPos, MaxErr,
               NofSegs, Chain, Segs);
   }else{
      GetMem (Segs);
      Segs[*NofSegs].r0 = Line[0].r;
      Segs[*NofSegs].c0 = Line[0].c;
      Segs[*NofSegs].r1 = Line[LineLen-1].r;
      Segs[*NofSegs].c1 = Line[LineLen-1].c;
      ++*NofSegs;
}  }
